package com.zjsru.plan2023.oneday.oneDay202301;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: CookLee
 * @Date: 2023/1/12 替换字符串中的括号内容
 * <p>
 * 输入：s = "(name)is(age)yearsold", knowledge = [["name","bob"],["age","two"]] 输出："bobistwoyearsold" 解释： 键 "name" 对应的值为
 * "bob" ，所以将 "(name)" 替换为 "bob" 。 键 "age" 对应的值为 "two" ，所以将 "(age)" 替换为 "two" 。
 * <p>
 * 输入：s = "hi(name)", knowledge = [["a","b"]] 输出："hi?" 解释：由于不知道键 "name" 对应的值，所以用 "?" 替换 "(name)" 。
 * <p>
 * 输入：s = "(a)(a)(a)aaa", knowledge = [["a","yes"]] 输出："yesyesyesaaa" 解释：相同的键在 s 中可能会出现多次。 键 "a" 对应的值为 "yes" ，所以将所有的
 * "(a)" 替换为 "yes" 。 注意，不在括号里的 "a" 不需要被替换。
 */
public class Evaluate {
    
    public String evaluate(String s, List<List<String>> knowledge) {
        //list内容转换map
        Map<String, String> map = new HashMap<>();
        for (List<String> list : knowledge) {
            map.put(list.get(0), list.get(1));
        }
        //标记是否拼接key，true拼接，false拼接句子
        boolean addKey = false;
        //括号内替换值
        StringBuilder key = new StringBuilder();
        //句子拼接值
        StringBuilder sentence = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                addKey = true;
            } else if (s.charAt(i) == ')') {
                //不知道Key键对应的值，所以用 "?" 替换
                sentence.append(map.getOrDefault(key.toString(), "?"));
                //替换后 ，将判断条件设置false 便于拼接，并清楚key
                addKey = false;
                key.setLength(0);
            } else {
                //true 则先拼接key 作为括号替换的
                if (addKey) {
                    key.append(s.charAt(i));
                } else {
                    //false 则拼接全句
                    sentence.append(s.charAt(i));
                }
            }
        }
        return sentence.toString();
    }
    
    public static void main(String[] args) {
        Evaluate evaluate = new Evaluate();
        String s = "(name)is(age)yearsold";
        List<List<String>> knowledge = new ArrayList<>();
        List<String> list1 = new ArrayList<>();
        list1.add("name");
        list1.add("bob");
        knowledge.add(list1);
        List<String> list2 = new ArrayList<>();
        list2.add("age");
        list2.add("two");
        knowledge.add(list2);
        System.out.println(evaluate.evaluate(s, knowledge));
    }
    
}
